스무딩 타깃 인코딩
스무딩 타깃 인코딩
스무딩 타깃코딩(Smoothing Target Encoding은 범주형 변수를 수치형 변수로 변환하는 데이터 정제 기법 중 하나로, 특히 머신러닝 모델의 성능 향상을 위해 널리 사용된다. 이 기법은 범주형 변수의 각 카테고리에 대해 해당 카테고리가 목표 변수(target variable)에 미치는 영향을 수치로 표현하면서, 소수의 샘플로 인한 과적합(overfitting) 문제를 완화**하는 데 초점을 둔다.
개요
범주형 변수는 머신러닝 모델이 직접 처리하기 어려우므로 일반적으로 인코딩 과정을 거친다. 대표적인 인코딩 방식으로 원-핫 인코딩(One-Hot Encoding), 레이블 인코딩(Label Encoding) 등이 있지만, 카테고리가 많거나 불균형한 분포를 가진 경우 성능이 저하될 수 있다.
타깃 인코딩(Target Encoding)은 각 범주를 해당 카테고리에 속하는 샘플들의 목표 변수의 평균값으로 대체하는 방식이다. 예를 들어, 분류 문제에서 목표 변수가 이진(0 또는 1)이라면, 각 범주에 대해 그 범주에 속한 샘플들의 평균 타깃 값을 계산하여 그 범주를 대표하는 수치로 사용한다.
그러나 단순한 타깃 인코딩은 레어 카테고리(즉, 샘플 수가 매우 적은 카테고리)에서 문제가 된다. 예를 들어, 1개의 샘플만 있는 카테고리가 타깃 값 1을 가진다면, 이 카테고리는 1.0으로 인코딩되어 모델이 이를 과도하게 신뢰하게 된다. 이는 과적합으로 이어질 수 있다.
이러한 문제를 해결하기 위해 도입된 것이 스무딩 타깃 인코딩이다. 이 기법은 각 카테고리의 로컬 타깃 평균과 글로벌 타깃 평균을 가중 평균하여 최종 인코딩 값을 결정함으로써, 소수 데이터에 의한 노이즈를 억제한다.
스무딩 타깃 인코딩의 수식
스무딩 타깃 인코딩의 기본 수식은 다음과 같다:
$$ \text{Encoded Value} = \frac{n_i \cdot \mu_i + \alpha \cdot \mu_{\text{global}}}{n_i + \alpha} $$
여기서: - $n_i$: 카테고리 $i$에 속한 샘플의 수 - $\mu_i$: 카테고리 $i$ 내 샘플들의 타깃 평균 - $\mu_{\text{global}}$: 전체 데이터셋의 타깃 평균 - $\alpha$: 스무딩 파라미터 (하이퍼파라미터)
해석
- $n_i$가 작을수록(즉, 카테고리 샘플 수가 적을수록) 인코딩 값은 글로벌 평균 $\mu_{\text{global}}$에 가까워진다.
- $n_i$가 클수록 로컬 평균 $\mu_i$에 가까워진다.
- $\alpha$는 스무딩 강도를 조절하는 값으로, 일반적으로 경험적으로 설정되며, 보통 1~10 사이의 값을 사용한다.
스무딩 타깃 인코딩의 장점
- 과적합 방지: 소수의 샘플을 가진 카테고리에 대해 과도한 신뢰를 방지한다.
- 범주형 정보의 효과적 활용: 카테고리와 목표 변수 간의 관계를 수치로 표현함으로써 모델이 학습하기 쉬운 형태로 변환한다.
- 고차원 문제 해결: 원-핫 인코딩과 달리 차원 증가 없이 인코딩이 가능하다.
주의사항 및 위험 요소
- 리크(leak) 방지 필요: 학습 데이터에서 타깃 값을 기반으로 인코딩을 수행할 경우, 타깃 정보가 테스트 데이터에 누수될 수 있다. 이를 방지하기 위해 반드시 교차 검증(cross-validation) 기반의 타깃 인코딩 또는 out-of-fold 방식을 사용해야 한다.
예: K-겹 교차 검증에서 각 폴드의 검증 데이터는 그 폴드 외의 학습 데이터를 기반으로 인코딩 값을 계산받아야 한다.
- 회귀 vs 분류 문제 적용 차이:
- 분류 문제: 이진 또는 다중 클래스 타깃의 평균(예: 1의 비율)
-
회귀 문제: 타깃 값의 평균(예: 평균 가격)
-
파라미터 조정 필요: 스무딩 파라미터 $\alpha$는 데이터에 따라 최적값이 달라지므로, 그리드 서치나 베이지안 최적화 등을 통해 조정하는 것이 좋다.
구현 예시 (Python)
import pandas as pd
import numpy as np
from sklearn.model_selection import KFold
def smoothing_target_encoding(train_df, test_df, cat_col, target_col, alpha=5):
# 전체 데이터의 글로벌 평균
global_mean = train_df[target_colmean()
# 각 카테고리별 통계
cat_stats = train_df.groupby(cat_col)[target_col].agg(['mean', 'count']).reset_index()
cat_stats['smoothed'] = (cat_stats['count'] * cat_stats['mean'] + alpha * global_mean) / (cat_stats['count'] + alpha)
# 매핑 생성
mapping = dict(zip(cat_stats[cat_col], cat_stats['smoothed']))
# 학습 및 테스트 데이터 인코딩
train_encoded = train_df[cat_col].map(mapping).fillna(global_mean)
test_encoded = test_df[cat_col].map(mapping).fillna(global_mean)
return train_encoded, test_encoded
관련 기법
- Leave-One-Out Target Encoding: 현재 샘플을 제외한 동일 카테고리 내 타깃 평균을 사용하여 리크를 줄임.
- Bayesian Target Encoding: 베이지안 추론 기반으로 사전 분포를 설정하여 인코딩.
- James-Stein Estimator: 통계적 추정 기법을 활용한 스무딩 방식.
참고 자료
- Micci-Barreca, D. (2001). "A Preprocessing Scheme for High-Cardinality Categorical Attributes in Classification and Prediction Problems." ACM SIGKDD Explorations Newsletter.
- Kaggle 커널: "Target Encoding Best Practices"
- sklearn-contrib 패키지:
[category_encoders](/doc/%EA%B8%B0%EC%88%A0/%EB%8D%B0%EC%9D%B4%ED%84%B0%EA%B3%BC%ED%95%99/%EB%8D%B0%EC%9D%B4%ED%84%B0%20%EB%B6%84%EC%84%9D%20%EB%8F%84%EA%B5%AC/category_encoders)
라이브러리의[TargetEncoder](/doc/%EA%B8%B0%EC%88%A0/%EB%8D%B0%EC%9D%B4%ED%84%B0%EA%B3%BC%ED%95%99/%EB%8D%B0%EC%9D%B4%ED%84%B0%20%EB%B6%84%EC%84%9D%20%EB%8F%84%EA%B5%AC/TargetEncoder)
스무딩 타깃 인코딩은 데이터 정제 과정에서 고차원 범주형 변수를 효과적으로 처리하고, 모델의 일반화 성능을 높이는 강력한 도구이다. 다만, 타깃 리크를 철저히 방지하고, 적절한 스무딩 파라미터를 선택하는 것이 성공적인 적용을 위한 핵심 요소이다.
이 문서는 AI 모델(qwen-3-235b-a22b-instruct-2507)에 의해 생성된 콘텐츠입니다.
주의사항: AI가 생성한 내용은 부정확하거나 편향된 정보를 포함할 수 있습니다. 중요한 결정을 내리기 전에 반드시 신뢰할 수 있는 출처를 통해 정보를 확인하시기 바랍니다.